package jndi.ldap.biz.ad;

public class ADOperator {
//    private final static Logger log = LoggerFactory.getLogger(ADOperator.class);
//
//    private LdapConnection connection;
//
//    /* (non-Javadoc)
//     * @see jndi.LDAPOperations#search(java.lang.String, java.lang.String, javax.naming.directory.SearchControls)
//     */
//    public NamingEnumeration<SearchResult> search(List<String> searchBase, String searchFilter, SearchControls cons) {
//        NamingEnumeration<SearchResult> enumResults = null;
//
//        try {
//            enumResults = connection.search(searchBase, searchFilter, cons);
////            while (enumResults.hasMoreElements()) {
////                SearchResult result = enumResults.next();
////                NamingEnumeration<? extends Attribute> attrs = result.getAttributes().getAll();
////                log.debug("--------------------------------------------------");
////                log.debug("Object full name:" + result.getNameInNamespace());
////                while (attrs.hasMoreElements()) {
////                    Attribute attr = attrs.next();
////                    log.debug(attr.getID() + "=" + attr.get());
////                }
////            }
//
//            if (log.isDebugEnabled()) {
//            }
//
//        } catch (NamingException e) {
//            throw new RuntimeException(e);
//        }
//
//        return enumResults;
//    }
//
//    /* (non-Javadoc)
//     * @see jndi.LDAPOperations#getRootDSE()
//     */
//    public SearchResult getRootDSE() {
//        List<String> searchBase = "";
//
//        String searchFilter = "(&(objectClass=*))";
//
//        SearchControls cons = new SearchControls();
//        cons.setSearchScope(SearchControls.OBJECT_SCOPE);
//        SearchResult rootDSE = null;
//
//        NamingEnumeration<SearchResult> results = this.search(searchBase, searchFilter, cons);
//        while (results.hasMoreElements()) {
//            try {
//                rootDSE = results.next();
//            } catch (NamingException e) {
//                throw new RuntimeException(e);
//            }
//        }
//
//        return rootDSE;
//    }
//
//    /* (non-Javadoc)
//     * @see jndi.LDAPOperations#getConfigurationNamingContext()
//     */
//    public List<String> getConfigurationNamingContext() {
//        List<String> cnc = null;
//        SearchResult rootDSE = getRootDSE();
//        if (rootDSE == null)
//            return cnc;
//
//        NamingEnumeration<? extends Attribute> attrs = rootDSE.getAttributes().getAll();
//        while (attrs.hasMoreElements()) {
//            Attribute attr;
//            try {
//                attr = attrs.next();
//                if (attr.getID().equals("configurationNamingContext")) {
//                    cnc = (String) attr.get();
//                }
//            } catch (NamingException e) {
//                throw new RuntimeException(e);
//            }
//        }
//
//        return cnc;
//    }
//
//    /* (non-Javadoc)
//     * @see jndi.LDAPOperations#getNetBIOS(java.lang.String)
//     */
//    public List<SearchResult> getPartitions() {
//        List<SearchResult> netBIOSs = new ArrayList<SearchResult>();
//
//        String searchFilter = "(NETBIOSName=*)";
//
//        SearchControls cons = new SearchControls();
//        cons.setSearchScope(SearchControls.SUBTREE_SCOPE);
//
//        NamingEnumeration<SearchResult> enumResults = this.search(getConfigurationNamingContext(), searchFilter, cons);
//        while (enumResults.hasMoreElements()) {
//            netBIOSs.add(enumResults.nextElement());
//        }
//
//        return netBIOSs;
//    }
//
//    private Map<String, String> getNetBIOSNameDNSRootMap(boolean netBIOSName2DNSRoot){
//        Map<String, String> rtnMap;
//        Map<String, String> netBIOSNameByDNSRoot = new HashMap<String, String>();
//        Map<String, String> dnsRootByNetBIOSName = new HashMap<String, String>();
//        String searchFilter = "(NETBIOSName=*)";
//
//        String[] rtnSearchAttrs = {"nETBIOSName", "dnsRoot"};
//        SearchControls cons = new SearchControls();
//        cons.setSearchScope(SearchControls.SUBTREE_SCOPE);
//        cons.setReturningAttributes(rtnSearchAttrs);
//
//        NamingEnumeration<SearchResult> enumResults = this.search(getConfigurationNamingContext(), searchFilter, cons);
//        while (enumResults.hasMoreElements()) {
//            Attributes attrs = enumResults.nextElement().getAttributes();
//            String netBIOSName;
//            String dnsRoot;
//
//            try {
//                netBIOSName = (String) attrs.get("nETBIOSName").get();
//                dnsRoot = (String) attrs.get("dnsRoot").get();
//            } catch (NamingException e) {
//                throw new RuntimeException(e);
//            }
//            netBIOSNameByDNSRoot.put(dnsRoot, netBIOSName);
//            dnsRootByNetBIOSName.put(netBIOSName, dnsRoot);
//        }
//
//        if (netBIOSName2DNSRoot) {
//            rtnMap = dnsRootByNetBIOSName;
//        } else {
//            rtnMap = netBIOSNameByDNSRoot;
//        }
//
//        return rtnMap;
//    }
//
//    /* (non-Javadoc)
//     * @see jndi.LDAPOperations#getNetBIOSNameDNSRootMap(java.lang.String)
//     */
//    public Map<String, String> getDNSRootsByNetBIOSName(){
//        return getNetBIOSNameDNSRootMap(true);
//    }
//
//
//    /* (non-Javadoc)
//     * @see jndi.LDAPOperations#getNetBIOSNamesByDNSRoot()
//     */
//    public Map<String, String> getNetBIOSNamesByDNSRoot() {
//        return getNetBIOSNameDNSRootMap(false);
//    }
//
//    /* (non-Javadoc)
//     * @see jndi.LDAPOperations#getBaseDN()
//     */
//    public List<String> getBaseDN() {
//        List<String> baseDN = null;
//
//        Attributes attrs = getRootDSE().getAttributes();
//        try {
//            baseDN = (String) attrs.get("defaultNamingContext").get();
//        } catch (NamingException e) {
//            throw new RuntimeException(e);
//        }
//
//        if (baseDN == null) {
//            baseDN = this.connection.getConnectionManager().getDefaultBaseDNs();
//        }
//
//        return baseDN;
//    }
//
//
//    private boolean isUserTerminated(int userAccountControl) {
//        final int ADS_UF_ACCOUNTDISABLE = 0x00000002;
//        final int ADS_UF_NORMAL_ACCOUNT = 0x00000200;
//        final int ADS_UF_PASSWORD_EXPIRED = 0x00800000;
//
//        if ((userAccountControl & ADS_UF_NORMAL_ACCOUNT) == 0x0) {
//            return true;
//        }
//
//        if ((userAccountControl & ADS_UF_ACCOUNTDISABLE) == ADS_UF_ACCOUNTDISABLE) {
//            return true;
//        }
//
//        if ((userAccountControl & ADS_UF_PASSWORD_EXPIRED) == ADS_UF_PASSWORD_EXPIRED) {
//            return true;
//        }
//
//        return false;
//    }
//
//    private String getUserDomainNameByPrincipalName(String userPrincipalName){
//        if (userPrincipalName == null) {
//            return null;
//        }
//
//        Map<String, String> netBIOSNameDNSRootMap = getNetBIOSNamesByDNSRoot();
//        int demarcationIndex = userPrincipalName.lastIndexOf('@');
//        String userName = userPrincipalName.substring(0, demarcationIndex);
//        String dnsName = userPrincipalName.substring(demarcationIndex + 1);
//        String domainName = netBIOSNameDNSRootMap.get(dnsName);
//        return domainName + "\\" + userName;
//    }
//
//    /* (non-Javadoc)
//     * @see jndi.LDAPOperations#getActiveUsers()
//     */
//    public List<String> getAllActiveUsers() {
//        List<String> activeUsers = new ArrayList<String>();
//        String searchFilter = "(&(objectClass=user)(userPrincipalName=*))";
//
//        SearchControls cons = new SearchControls();
//        cons.setSearchScope(SearchControls.SUBTREE_SCOPE);
//        NamingEnumeration<SearchResult> users = search(getBaseDN(), searchFilter, cons);
//        while (users.hasMoreElements()) {
//            Attributes userAttrs = users.nextElement().getAttributes();
//            int userAccountControl;
//            String userPrincipalName;
//            try {
//                userAccountControl = Integer.decode((String) userAttrs.get("userAccountControl").get());
//                if (isUserTerminated(userAccountControl))
//                    continue;
//                userPrincipalName = (String) userAttrs.get("userPrincipalName").get();
//            } catch (NamingException e) {
//                throw new RuntimeException(e);
//            }
//
//            String userDomainName = getUserDomainNameByPrincipalName(userPrincipalName);
//            if (userDomainName != null) {
//                activeUsers.add(userDomainName);
//            }
//        }
//
//        return activeUsers;
//    }
//
//
//    /* (non-Javadoc)
//     * @see jndi.ldap.biz.LdapOperator#getDomainComponent()
//     */
//    public String getDomainComponent() {
//        String dc = null;
//
//        List<String> baseDN = getBaseDN();
//        String searchFilter = "(objectclass=*)";
//        String[] rtnSearchAttrs = {"dc"};
//        SearchControls cons = new SearchControls();
//        cons.setSearchScope(SearchControls.OBJECT_SCOPE);
//        cons.setReturningAttributes(rtnSearchAttrs);
//
//        NamingEnumeration<SearchResult> results = search(baseDN, searchFilter, cons);
//        while (results.hasMoreElements()){
//            try {
//                dc = (String) results.nextElement().getAttributes().get("dc").get();
//            } catch (NamingException e) {
//                throw new RuntimeException(e);
//            }
//        }
//
//        return dc;
//    }
//
//    private List<String> getPartitionUsersLoginIds(String host, List<String> baseDN){
//        List<String> usersLoginIds = new ArrayList<String>();
//
//        if ("emrets.org".equals(host)) return usersLoginIds;
//
//        LdapConnection conn = DefaultLdapConnectionManager.getInstance().openConnection("ldap://" + host);
//        ADOperator op = new ADOperator();
//        op.setConnection(conn);
//        String dc = op.getDomainComponent();
//
//        String searchFilter = "(&(objectClass=user)(sAMAccountName=*admin*))";
//        String[] rtnSearchAttrs = {"sAMAccountName"};
//        SearchControls cons = new SearchControls();
//        cons.setSearchScope(SearchControls.SUBTREE_SCOPE);
//        cons.setReturningAttributes(rtnSearchAttrs);
//
//        NamingEnumeration<SearchResult> results = search(baseDN, searchFilter, cons);
//        while (results.hasMoreElements()){
//            String username = null;
//            try {
//                username = (String) results.nextElement().getAttributes().get("sAMAccountName").get();
//            } catch (NamingException e) {
//                throw new RuntimeException(e);
//            }
//            usersLoginIds.add(dc + "\\" + username);
//            log.debug(dc + "\\" + username);
//        }
//
//        DefaultLdapConnectionManager.getInstance().closeConnection(conn);
//        return usersLoginIds;
//    }
//    /* (non-Javadoc)
//     * @see jndi.ldap.biz.LdapOperator#getAllUsersLoginIds()
//     */
//    public List<String> getAllUsersLoginIds(){
//        List<String> allUsersLoginIds = new ArrayList<String>();
//        List<SearchResult> partitions = getPartitions();
//
//        for (SearchResult partition : partitions){
//            Attributes ptAttrs = partition.getAttributes();
//            String dnsRoot = null;
//            List<String> nCName = null;
//            try {
//                dnsRoot = (String) ptAttrs.get("dnsRoot").get();
//                nCName = (String) ptAttrs.get("nCName").get();
//            } catch (NamingException e) {
//                // TODO Auto-generated catch block
//                e.printStackTrace();
//            }
//
//            if (dnsRoot == null || dnsRoot.trim().length() == 0)
//                continue;
//            if (nCName == null || nCName.trim().length() == 0)
//                continue;
//
//            List<String> usersLoginIds = getPartitionUsersLoginIds(dnsRoot, nCName);
//            allUsersLoginIds.addAll(usersLoginIds);
//        }
//
//        return allUsersLoginIds;
//    }
//
//    /* (non-Javadoc)
//     * @see jndi.LDAPOperations#getConnection()
//     */
//    public LdapConnection getConnection() {
//        return connection;
//    }
//
//    /* (non-Javadoc)
//     * @see jndi.LDAPOperations#setConnection(jndi.LdapConnection)
//     */
//    public void setConnection(LdapConnection connection) {
//        this.connection = connection;
//    }
//
}
